package main

import "fmt"

func main() {
	/*
		避免代码重复编写
		功能扩展容易方便
	*/

	fmt.Println(sum(10, 15, 30))

	nums := []int{1, 2, 3, 4, 5, 6, 7, 85, 1, 2, 15, 416, 3}
	fmt.Println(sum(nums...))

	fmt.Println(sumandaut(10, 5))

	sum, cut := sumandaut(10, 5)
	fmt.Println(sum, cut)

	fmt.Println(getcut())

	a := sumandaut1 //函数在go语言中是一种复合类型，可以看做一种特殊的变量
	fmt.Println(a)
	a = sumandaut
	fmt.Println(a)
}

//返回多个参数
func sumandaut(a, b int) (int, int) {
	return a + b, a - b
}
func sumandaut1(a, b int) (int, int) {
	return a + b, a - b
}

//定义返回变量名
func getcut() (cut int) { //cut 相当于函数创建时就定义了一个变量，返回时就不需要写返回的内容了，会自动返回这个
	cut = 10
	return
}

//可变参数  只能在末尾使用一个可变参数
func sum(a ...int) int {
	sum := 0
	for i := 0; i < len(a); i++ {
		sum += a[i]
	}
	return sum
}

//外层函数把内层函数作为返回值返回，称闭包    闭包 执行一次都是独立的 in 每次返回的函数都是独立的
func in() func() int {
	i := func() int {
		return 0
	}
	return i
}
